home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
051-075
/
073
/
parout
/
parout.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
4KB
|
139 lines
/* parout.c - Parallel port resource example.
*
* Phillip Lindsay (c) Commodore-Amiga, Inc.
* Unlimited use granted as long as copyright notice remains intact.
*
*/
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/interrupts.h>
#include <hardware/custom.h>
#include <hardware/intbits.h>
#include <hardware/cia.h>
#include <resources/misc.h>
#include <resources/cia.h> /* this header has defines for hardware addresses */
#define CIAA_DDRPBOUT 0xff /* CIAA port B all "ouputs" */
#define MANX /* using MANX Aztec C */
#ifdef MANX
#include <functions.h>
#endif
extern CPTR GetMiscResource();
extern VOID FreeMiscResource();
extern ULONG CIAARoutine();
struct MiscResource *MiscResource=NULL;
CPTR CIAAResource=NULL;
char *myname = "myparallel";
char *teststr= "This is a test line being sent to a parallel device.\n";
struct Task *mytask;
LONG mysignal;
ULONG mysigmask;
main()
{
struct Interrupt CIAAInterrupt;
register count=0;
MiscResource = (struct MiscResource *) OpenResource(MISCNAME);
if(!MiscResource) exit(10);
puts("after open misc.resource");
CIAAResource = (CPTR) OpenResource(CIAANAME);
if(!CIAAResource) exit(20);
puts("after open ciaa.resource");
/* this is where we get our 8bits for parallel transfer */
if(GetMiscResource(MiscResource,MR_PARALLELPORT,myname)) exit(30);
puts("after GetMiscResource PARALLELPORT (CIAA Port B)");
/* this is where we get busy(bit 0), pout(bit 1), sel(bit 2) */
if(GetMiscResource(MiscResource,MR_PARALLELBITS,myname))
{
FreeMiscResource(MiscResource,MR_PARALLELPORT);
exit(40);
}
puts("after GetMiscResource PARALLELBITS BUSY/POUT/SEL (CIAB Port A bits 0,1,2)");
if((mysignal = AllocSignal(-1L)) == -1L)
{
FreeMiscResource(MiscResource,MR_PARALLELPORT);
FreeMiscResource(MiscResource,MR_PARALLELBITS);
exit(50);
}
puts("after AllocSignal()");
mysigmask = 1L << mysignal;
/* now we own the parallel port, next handshake interrupt ACK */
setmem(&CIAAInterrupt,(ULONG)sizeof(CIAAInterrupt),(ULONG)'\0');
puts("after setmem()");
CIAAInterrupt.is_Data = (APTR) CIAAResource;
CIAAInterrupt.is_Code = (VOID(*)()) CIAARoutine;
CIAAInterrupt.is_Node.ln_Type = NT_INTERRUPT;
CIAAInterrupt.is_Node.ln_Name = myname;
puts("after interrupt init");
if(AddICRVector(CIAAResource,CIAICRB_FLG,&CIAAInterrupt))
{
FreeMiscResource(MiscResource,MR_PARALLELPORT);
FreeMiscResource(MiscResource,MR_PARALLELBITS);
FreeSignal(mysignal);
exit(50);
}
puts("after AddICRVector()");
/* disable ACK interrupt */
AbleICR(CIAAResource,CIAICRF_FLG);
puts("after AbleICR() disable flag interrupt");
/* set up direction for i/o ports used */
ciaa.ciaddrb = CIAA_DDRPBOUT; /* make CIAA port B all "ouputs" */
/* make BUSY, SEL, POUT "inputs" on CIAA port A */
ciab.ciaddra &= ( ~CIAF_PRTRBUSY | ~CIAF_PRTRPOUT | ~CIAF_PRTRSEL );
/* clear any pending interrupts */
SetICR(CIAAResource,CIAICRF_FLG);
puts("after SetICR() clear pending flag interrupts");
/* enable ACK interrupt */
AbleICR(CIAAResource,CIAICRF_SETCLR|CIAICRF_FLG);
puts("after AbleICR() enable flag interrupt");
while(teststr[count])
{
if(ciab.ciapra & CIAF_PRTRBUSY) /* make sure device is not busy */
continue;
ciaa.ciaprb = teststr[count++]; /* write data to port */
wait(mysigmask); /* wait for ack */
}
AbleICR(CIAAResource,CIAICRF_FLG); /* disable interrupt */
/* remove interrupt */
RemICRVector(CIAAResource,CIAICRB_FLG,&CIAAInterrupt);
/* free resources */
FreeMiscResource(MiscResource,MR_PARALLELPORT);
FreeMiscResource(MiscResource,MR_PARALLELBITS);
FreeSignal(mysignal);
}
/* end of main() */
ULONG CIAARoutine()
{
#ifdef MANX
geta4();
#endif
Signal(mytask,mysigmask);
return(0L);
}
/* eof */